package com.icongyou.enterprise.data_aggregation.mapper;

import com.icongyou.enterprise.data_aggregation.entity.*;
import com.icongyou.enterprise.data_aggregation.entity.vo.StudentTopSubmissionDetailVO;
import com.icongyou.enterprise.data_aggregation.entity.vo.StudentTopSubmissionSimpleVO;
import com.icongyou.enterprise.talent_profile.entity.vo.CourseTopSubmissionVO;
import com.icongyou.enterprise.talent_profile.entity.vo.SubmissionDetailVO;
import com.icongyou.enterprise.talent_pool.entity.vo.CoreSubmissionVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

@Mapper
public interface DataAggregationMapper {

    /**
     * 更新用户信息
     */
    int updateUserInfo(UserEntity userEntity);

    // 根据账号查询用户
    UserEntity getUserByAccount(@Param("account") String account);

    // 根据公司名称查询公司id
    String selectTenantIdByName(@Param("tenantName") String tenantName);

    // 验证登录用户公司是否匹配
    Integer validateUserTenant(@Param("userId") String userId, @Param("tenantId") String tenantId);

    // 插入用户
    int insertUser(UserEntity user);

    // 更新用户最后登录时间
    int updateUserLastLoginTime(@Param("userId") String userId, @Param("loginTime") LocalDateTime loginTime);

    // 根据条件查询学生列表
    List<UserEntity> getStudentByCondition(@Param("condition") Map<String, Object> condition);

    // 根据ID查询学生信息
    UserEntity getStudentById(@Param("studentId") String studentId);

    //根据ID查询用户信息
    UserEntity getUserById(@Param("userId") String userId);

    // 查询学生的课程列表
    List<CourseStudentEntity> getStudentCourse(@Param("studentId") String studentId);

    // 查询学生在特定课程中的进度
    CourseProgressEntity getStudentCourseProgress(@Param("studentId") String studentId,
                                                  @Param("courseId") String courseId);

    // 查询学生在特定课程中的任务成绩
    List<AssignmentStudentEntity> getStudentAssignmentScore(@Param("studentId") String studentId,
                                                            @Param("courseId") String courseId);

    // 查询学生在特定任务中的提交记录
    List<SubmissionEntity> getStudentSubmission(@Param("studentId") String studentId,
                                                @Param("assignmentId") String assignmentId);

    // 根据提交ID查询批改记录
    List<GradeEntity> getStudentGrade(@Param("submissionId") String submissionId);

    // 查询课程排名
    List<CourseStudentEntity> getCourseRanking(@Param("courseId") String courseId);

    // 查询学生参与的团队
    List<TeamMemberEntity> getStudentTeam(@Param("studentId") String studentId);

    // 根据团队ID查询团队信息
    TeamEntity getTeamById(@Param("teamId") String teamId);

    // 查询学生能力等级
    String getStudentCompetencyLevel(@Param("studentId") String studentId,
                                     @Param("courseId") String courseId);

    // 查询教师评语
    List<GradeEntity> getTeacherComment(@Param("studentId") String studentId);

    // 聚合查询：获取学生原始指标（用于画像计算）
    Map<String, Object> getStudentRawMetrics(@Param("studentId") String studentId,
                                             @Param("passThreshold") Double passThreshold,
                                             @Param("complexThreshold") Integer complexThreshold,
                                             @Param("maxLateDays") Integer maxLateDays);

    // 新增方法 - 人才档案详情模块专用
    // 根据租户ID查询租户信息
    TenantEntity getTenantById(@Param("tenantId") String tenantId);

    // 根据课程ID查询课程信息
    CourseEntity getCourseById(@Param("courseId") String courseId);

    // 查询学生在特定课程中的所有提交记录
    List<SubmissionEntity> getStudentSubmissionsByCourse(@Param("studentId") String studentId,
                                                         @Param("courseId") String courseId);

    // 获取所有学生ID
    List<String> getAllStudentIds();

    // 查询课程总成绩
    List<Map<String, Object>> getCourseTotalScores();

    // 查询硬技能标签
    List<String> getHardSkillTags();

    // 添加关注标记
    int insertFocusMark(@Param("focusMark") StudentFocusMarkEntity focusMark);

    // 删除关注标记
    int deleteFocusMark(@Param("userId") String userId, @Param("studentId") String studentId);

    // 检查是否已关注
    StudentFocusMarkEntity getFocusMark(@Param("userId") String userId, @Param("studentId") String studentId);

    // 检查学生是否为教师推荐
    int countTeacherRecommended(@Param("studentId") String studentId);

    // 检查学生是否在核心任务top 30%
    Boolean isCoreTaskTop30(@Param("studentId") String studentId);

    // 获取学生的核心成果（得分最高的提交）
    CoreSubmissionVO getCoreSubmission(@Param("studentId") String studentId);

    // 根据专业统计学生数量
    Integer countStudentsByMajor(@Param("tenantId") String tenantId, @Param("major") String major);

    // 根据用户ID查询租户名称
    String getTenantNameByUserId(String userId);

    //查询当前学生的课程进度汇总信息
    List<CourseProgressEntity> selectCourseProgressByStudentId(@Param("studentId") String studentId);

    //根据课程id查询课程名称
    String selectCourseNameById(@Param("courseId") String courseId);

    //查询自某个时间点以来新增的任务分配记录
    List<AssignmentStudentEntity> selectNewAssignmentsSince(@Param("studentId") String studentId,
                                                            @Param("courseId") String courseId,
                                                            @Param("sinceTime") LocalDateTime sinceTime);

    //查询自某个时间点以来新增的提交记录(特定学生和课程)
    List<SubmissionEntity> selectStudentNewSubmissionsSince(@Param("studentId") String studentId,
                                                     @Param("courseId") String courseId,
                                                     @Param("sinceTime") LocalDateTime sinceTime);

    //查询自某个时间点以来的贡献度记录
    List<ContributionRecord> selectContributionRecords(@Param("studentId") String studentId,
                                                       @Param("courseId") String courseId);

    //查询当前学生在某课程中的新任务
    List<AssignmentStudentVO> selectActiveAssignments(@Param("studentId") String studentId,
                                                      @Param("courseId") String courseId);

    //根据任务id查询任务名称
    String selectAssignmentNameById(@Param("assignmentId") String assignmentId);

    //根据学生id查询学生真实姓名
    String selectRealNameById(@Param("studentId") String studentId);
    
    //获取指定时间之后的所有新提交记录（不过滤学生和课程）
    List<SubmissionEntity> selectAllNewSubmissionsSince(@Param("sinceTime") LocalDateTime sinceTime);
    
    //获取指定时间之后的所有新成绩记录（不过滤学生）
    List<GradeEntity> selectAllNewGradesSince(@Param("sinceTime") LocalDateTime sinceTime);

    /**
     * 获取学生得分比例最高的三个提交 - 简版（首页用）
     * @param studentId 学生ID
     * @return 简版提交列表
     */
    List<StudentTopSubmissionSimpleVO> getTopSubmissionsSimple(@Param("studentId") String studentId);

    /**
     * 获取学生得分比例最高的三个提交 - 完整版（详情页用）
     * @param studentId 学生ID
     * @return 完整版提交列表
     */
    List<StudentTopSubmissionDetailVO> getTopSubmissionsDetail(@Param("studentId") String studentId);

    /**
     * 根据提交ID获取单个提交的详细内容
     * @param submissionId 提交ID
     * @return 提交详情
     */
    SubmissionDetailVO getSubmissionDetailById(@Param("submissionId") String submissionId);

    // 获取任务信息
    AssignmentEntity getAssignmentInfo(String assignmentId);

    /**
     * 统计所有学生数量
     */
    Long countAllStudents();

    /**
     * 分页查询学生信息
     */
    List<UserEntity> getStudentsWithPagination(@Param("offset") int offset, @Param("size") int size);

    /**
     * 获取学生在指定课程中得分最高的提交
     */
    CourseTopSubmissionVO getTopSubmissionByStudentAndCourse(@Param("studentId") String studentId,
                                                             @Param("courseId") String courseId);

    /**
     * 批量获取任务信息
     */
    List<AssignmentEntity> getAssignmentsByIds(List<String> assignmentIds);

    /**
     * 获取所有截止任务的信息
     */
    List<AssignmentEntity> getAllCompletedAssignments();

    Integer countHighPotentialSubmissions(@Param("studentId") String studentId);

    CoreSubmissionVO getCoreSubmissionByAssignmentId(@Param("studentId") String studentId, @Param("assignmentId") String assignmentId);
}